package labox.innovation.gameserver.model.itemcontainer;

import java.util.List;

import labox.innovation.db.ItemsDb;
import labox.innovation.gameserver.datatables.ItemTable;
import labox.innovation.gameserver.model.FuzeWorld;
import labox.innovation.gameserver.model.L2ItemInstance;
import labox.innovation.gameserver.model.L2Object;
import labox.innovation.gameserver.model.L2ItemInstance.ItemLocation;
import labox.innovation.gameserver.model.actor.instance.FuzePcInstance;
import labox.innovation.gameserver.templates.item.L2Item;

/**
 * 角色仓库
 * 
 * @author zjj
 * 
 */
public class PcWarehouse extends Warehouse {
	// private static final Logger _log =
	// Logger.getLogger(PcWarehouse.class.getName());

	private FuzePcInstance _owner;

	public PcWarehouse(FuzePcInstance owner) {
		_owner = owner;
	}

	protected PcWarehouse() {
	}

	public String getName() {
		return "Warehouse";
	};

	@Override
	public FuzePcInstance getOwner() {
		return _owner;
	}

	@Override
	public ItemLocation getBaseLocation() {
		return ItemLocation.WAREHOUSE;
	}

	public String getLocationId() {
		return "0";
	}

	public int getLocationId(boolean dummy) {
		return 0;
	}

	public void setLocationId(FuzePcInstance dummy) {
	}

	/**
	 * 仓库中 是否能放的下这个装备道具
	 * 
	 * @param item
	 * @return
	 */
	public boolean validateCapacity(L2ItemInstance item) {
//		int slots = 0;
//
//		// 如果物品不能叠加 或者 背包中还没这个物品。 且物品不是药草 那么这个物品需要占一个新的格
//		if (!(item.isStackable() && getItemByItemId(item.getItemId()) != null))
//			slots++;
//
//		return validateCapacity(slots);
		return validateCapacityByItemId( item.getItemId(), item.getCount() );
	}

	/**
	 * 仓库中 是否能放的下这些 装备道具
	 * 
	 * @param items
	 * @return
	 */
	public boolean validateCapacity(List<L2ItemInstance> items) {
		int slots = 0;

		for (L2ItemInstance item : items)
			if (!(item.isStackable() && getItemByItemId(item.getItemId()) != null))
				slots++;

		return validateCapacity(slots);
	}

	/**
	 * 仓库中 能否放的下这个物品
	 * 
	 * @param ItemId
	 * @return
	 */
	public boolean validateCapacityByItemId(int ItemId) {
//		int slots = 0;
//
//		L2ItemInstance invItem = getItemByItemId(ItemId);
//		// 如果背包中不存在这个物品 或者 这个物品不可叠加 那么需要占一个新的格
//		if (!(invItem != null && invItem.isStackable()))
//			slots++;
//
//		return validateCapacity(slots);
		return validateCapacityByItemId( ItemId, 1 );
	}
	
	
	public boolean validateCapacityByItemId(int ItemId, int count){
		int slots = 0;

		L2ItemInstance invItem = getItemByItemId(ItemId);
		L2Item item = ItemTable.getInstance().getTemplate(ItemId);

		if (item == null) {
			return false;
		}
		if( item.isMoney() && count < 0x7fffffff ){
			return true;
		}

		// 如果物品是可以堆叠的
		if (item.isStackable()) {

			// 物品存在 且 物品不能在叠加这么多数量, 或者 物品 不存在
			if ((invItem != null && !invItem.canStackable(count)) || invItem == null) {
				if (count > item.getMaxStackNums()) {

					int nums = (int) Math.ceil((float) count / item.getMaxStackNums());
					slots += nums;

				} else {
					slots += 1;
				}

			}

		} else {
			slots += count;
		}
		
		return validateCapacity(slots);
	}

	@Override
	public boolean validateCapacity(int slots) {
		return (_items.size() + slots <= getWareHouseSize());
	}

	@Override
	public int getMaxCurrentSoltNums() {
		// TODO Auto-generated method stub
		return _maxCurrentSoltNums;
	}

	@Override
	public void setMaxCurrentSoltNums(int maxCurrentSoltNums) {
		_maxCurrentSoltNums = maxCurrentSoltNums;

	}

	public void restore() {
		List<L2ItemInstance> _items = ItemsDb.restoreContainer(getOwnerId(), this);
		if (_items != null) {
			for (L2ItemInstance item : _items) {
				// 物品不需要立即进入世界
				// FuzeWorld.getInstance().enterWorld(item);

				// If stackable item is found in inventory just add to current quantity
//				if (item.isStackable() && getItemByItemId(item.getItemId()) != null)
//					addItem("Restore", item, getOwner().getActingPlayer(), null);
//				else
				if( item.getLocationSlot() == -1 || item.isMoney() || item.getCount() <= 0 )
				{
					continue;
				}
				
				addItem(item);
			}
		}
		refreshWeight();

	}

}
